package com.spring.framework.config.value;

import lombok.ToString;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 属性值注入
 *
 * @author xuweizhi
 * @since 2020/12/15 14:45
 */
@ToString
@Component
@SuppressWarnings("all")
public class ValueDemoStr {

	//基本类型
	@Value("1")
	private byte b;
	@Value("1")
	private char c;
	@Value("1")
	private short s;
	@Value("1")
	private int i;
	@Value("1")
	private long l;
	@Value("1")
	private float f;
	@Value("1")
	private double d;
	//boolean类型机器姬包装类可以使用true或者false字符串
	//也可以使用0代表false，1代表true
	@Value("0")
	private boolean boo;

	//字符串

	@Value("1")
	private String string;
	@Value("1")
	private CharSequence charSequence;

	//包装类型

	@Value("1")
	private Byte aByte;
	@Value("1")
	private Character character;
	@Value("1")
	private Short aShort;
	@Value("1")
	private Integer integer;
	@Value("1")
	private Long aLong;
	@Value("1")
	private Float aFloat;
	@Value("1")
	private Double aDouble;
	@Value("1")
	private Boolean aBoolean;

	//某些整形基本类型数组，使用,分隔即可自动拆分
	@Value("1,2,3,0,11,2")
	private short[] shorts;
	@Value("1,2,3,0,11,2")
	private int[] ints;
	@Value("1,2 3")
	private long[] longs;


	/**
	 * 下面的要使用SPEL 表达式  #{'要分割的数据'.进行的操作}
	 */
	@Value("#{'1,2,3,0,11,2'.split(',')}")
	private byte[] bytes;
	@Value("#{'1,0,1,1'.split(',')}")
	private char[] chars;
	@Value("#{'1,0,1,1'.split(',')}")
	private float[] floats;
	@Value("#{'1,0,1,1'.split(',')}")
	private double[] doubles;
	@Value("#{'1,0,1,1'.split(',')}")
	private boolean[] booleans;

	//SPEL可以调用String类的方法很多方法

	/**
	 * 大写
	 */
	@Value("#{'abc'.toUpperCase()}")
	private String upperCase;
	/**
	 * 截取
	 */
	@Value("#{'abc'.substring(1)}")
	private String substring;
	/**
	 * 拼接
	 */
	@Value("#{'abc'.concat('def')}")
	private String concat;

	/**
	 * SPEL计算
	 */
	@Value("#{4+2}")
	private int add;
	@Value("#{4-2}")
	private int subtract;
	@Value("#{4*2}")
	private int multiply;
	@Value("#{4/2}")
	private int divide;
	/**
	 * SPEL取一个随机数
	 */
	@Value("#{ T(java.lang.Math).random() * 100.0}")
	public double property1;

	/**
	 * 当然支持更多复杂计算…………
	 * SPEL转换数组和集合
	 * 单value集合    #{'value1,value2'.split(',')}
	 */
	@Value("#{'11,22,xx'.split(',')}")
	private String[] strings;
	@Value("#{'11,22, x x'.split(',')}")
	private CharSequence[] charSequences;
	@Value("#{'property1,property2,property2,property3'.split(',')}")
	private List<String> list;
	/**
	 * set会自动去重
	 */
	@Value("#{'property1,property2,property2,property3'.split(',')}")
	private Set<String> set;

	/* map集合 #{mapJsonValue} 类似于JSON格式  会自动去重 */
	@Value("#{{key1: 'value1', key2: 'value2', key2: 'value3'}}")
	private Map<String, String> map;

	/* @Value可以用在方法上，表示对方法的所有参数都注入同一个指定值 */
	private int anInt1;
	private int anInt2;
	private boolean anInt3;

	@Value("11")
	public void setAnInt(int anInt1) {
		this.anInt1 = anInt1;
	}

	@Value("1")
	public void setTwo(int anInt1, boolean anInt2) {
		this.anInt2 = anInt1;
		this.anInt3 = anInt2;
	}


	/**
	 * h @Value用在方法参数上也行，表示对指定参数注入指定值
	 */
	private int anInt4;

	public ValueDemoStr(@Value("22") int anInt4) {
		this.anInt4 = anInt4;
	}

	public static void main(String[] args) {
		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ValueDemoStr.class);
		System.out.println(applicationContext.getBean(ValueDemoStr.class));
	}
}
